package com.note.app.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.note.common.domain.VerificationCode;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.time.LocalDateTime;

/**
 * 验证码 Mapper
 */
@Mapper
public interface VerificationCodeMapper extends BaseMapper<VerificationCode> {

    /**
     * 查找最新的有效验证码
     * @param mobile 手机号
     * @param type 验证码类型
     * @param now 当前时间
     * @return 验证码记录
     */
    @Select("SELECT * FROM verification_code WHERE mobile = #{mobile} AND type = #{type} " +
            "AND expired_at > #{now} AND used = 0 ORDER BY id DESC LIMIT 1")
    VerificationCode findLatestValidCode(@Param("mobile") String mobile, 
                                        @Param("type") String type, 
                                        @Param("now") LocalDateTime now);
    
    /**
     * 查找最新的有效验证码MsgId
     * @param mobile 手机号
     * @param type 验证码类型
     * @param now 当前时间
     * @return 消息ID
     */
    @Select("SELECT msg_id FROM verification_code WHERE mobile = #{mobile} AND type = #{type} " +
            "AND expired_at > #{now} AND used = 0 ORDER BY id DESC LIMIT 1")
    String findLatestValidMsgId(@Param("mobile") String mobile, 
                               @Param("type") String type, 
                               @Param("now") LocalDateTime now);
    
    /**
     * 标记验证码为已使用
     * @param id 验证码ID
     * @return 影响行数
     */
    @Update("UPDATE verification_code SET used = 1, updated_at = NOW() WHERE id = #{id}")
    int markAsUsed(@Param("id") Long id);
    
    /**
     * 查找手机号注册情况
     * @param mobile 手机号
     * @return 用户ID，不存在则返回null
     */
    @Select("SELECT id FROM user WHERE mobile = #{mobile} AND deleted = 0 LIMIT 1")
    Long findUserIdByMobile(@Param("mobile") String mobile);
    
    /**
     * 获取指定时间段内的验证码发送次数
     * @param mobile 手机号
     * @param type 验证码类型
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 发送次数
     */
    @Select("SELECT COUNT(*) FROM verification_code WHERE mobile = #{mobile} AND type = #{type} " +
            "AND created_at BETWEEN #{startTime} AND #{endTime}")
    int countCodeSent(@Param("mobile") String mobile, 
                     @Param("type") String type, 
                     @Param("startTime") LocalDateTime startTime, 
                     @Param("endTime") LocalDateTime endTime);
} 